VSCodeを使用してroot権限でデバッグ実行する
1 はじめに
VSCodeを使用したNode.jsのデバッグは、非常に快適です。ブレークボイントを置いたり、スタックや変数を確認しながらトレース実行できるのは、一回使い出したらやめられないでしょう。
しかし、あるニーズがあって、DNSプロキシーを書いていて、ちょっと詰まったのでメモです。
2 バインドエラー
最初に、下記のような、単純なUDPをListenするプログラムを書いて実行したのですが、bindに失敗していました。
const dgram = require('dgram'); const server = dgram.createSocket('udp4'); server.on('listening', () => { console.log('start listening.'); }); server.on('message', (buf, rinfo) => { console.log(`>recv from${rinfo.address}:${rinfo.port}`); }); server.on('error', (err) => { console.log(`server error:\n${err.stack}`); server.close(); }); server.bind(53);
コマンドラインからsudoで実行するとエラーにはなりません。
$ sudo node index.js start listening.
また、ポート番号をを1024以上に設定しても、ちゃんとバインドできるので、単純にパーミッションエラーです。
3 user-data-dir
デバッグ実行するアプリをsudoで実行しようとして、下記のようにVCodeを起動しても効果がありません。
$sudo code .
VSCodeをsudoで起動するには、user-data-dirオプションが必要です。
$ sudo code --user-data-dir='~/.vscode-root'
user-data-dirオプションを指定して起動し、Open Folderで作業フォルダを開きます。
この状態で、デバッグ実行すると、ポート53のバインドが成功しているのが分かります。
4 最後に
ここまで方法を紹介しておいてなんですが・・・そもそもVSCodeを特権で起動することは、色々リスクを伴うので決してお勧めできません。あくまで、どうしても必要な場合に留めるべきでしょう。
5 参考リンク
Command Line Interface (CLI)
i can't run as root though i specify an alternate user data directory with the --user-data-dir argument